
const { client } = require("../config")
const  { PassThrough } = require("stream")
/**
 * 处理聊天请求的函数
 * @param {Object} req - 请求对象，包含用户发送的消息
 * @param {Object} response - 响应对象，用于向客户端发送处理结果
 * 
 * 该函数首先从请求体中获取用户消息，然后构建请求参数，
 * 调用 client.ChatCompletions 接口获取回复数据。
 * 根据接口返回的数据类型（流式或非流式），将回复数据发送给前端。
 * 如果接口调用出错，则返回错误信息。
 */
exports.chat_handler = (req, response) => {
    // 1.1 获取请求参数
    const { msg } = req.body;
    // 1.2 业务处理
    const params = {
        "Model": "hunyuan-pro",
        "Messages": [
            {
                "Role": "user",
                "Content": msg
            }
        ]
    }
    // 1.2.1 通过接口获取数据
    client.ChatCompletions(params).then(
        async (res) => {
            if (typeof res.on === "function") {
                // 流式响应
                // 1.2.2 将数据返回给前端
            } else {
                // 非流式响应
                // console.log(res)
                // 1.2.2 将数据返回给前端
                response.send({
                    code: 200,
                    msg: "success",
                    data: res,
                });
            }
        },
        (err) => {
            console.error("error", err);
            response.send({
                code: 500,
                msg: "error",
                data: err,
            });
        }
    );

}

// 处理聊天函数 stream_chat_handler
exports.stream_chat_handler = (req, response)=>{
    const { msg } = req.query;
    const params = {
        "Model": "hunyuan-pro",
        "Messages": [
            {
                "Role": "user",
                "Content": msg
            }
        ],
        "Stream": true // 流式数据
    }
    // 设置流式数据
    response.set({
        "Content-Type": "text/event-stream;charset=utf-8",
        "Cache-Control": "no-cache",
        "Connection": "keep-alive"
    })
    response.write("retry: 10000\n"); // 指定浏览器重新发起连接的时间间隔
    // 两种情况会导致浏览器重新发起连接：一种是时间间隔到期，二是由于网络错误等原因，导致连接出错
    const stream = new PassThrough();
    response.body = stream
    stream.pipe(response);
    // 1.2.1 通过接口获取数据
    client.ChatCompletions(params).then(
        async (res) => {
            if (typeof res.on === "function") {
                // 流式响应
                res.on("message", (message) => {
                    console.log(92,message)
                  const result = JSON.parse(message.data).Choices[0]
                  if(result.FinishReason === "stop"){
                    stream.write(`data: ${JSON.stringify(result)}\n\n`);
                    stream.end();
                    return;
                  }
                  stream.write(`data: ${JSON.stringify(result)}\n\n`);
                })
              } else {
                // 非流式响应
                console.log(res)
              }
        },
        (err) => {
            console.error("error", err);
            response.send({
                code: 500,
                msg: "error",
                data: err,
            });
        }
    );
}